package com.qf.service.impl;

import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qf.common.PageVO;
import com.qf.entity.product.ProductReview;
import com.qf.mapper.ProductReviewMapper;
import com.qf.param.DTO.ProductCommentPageDTO;
import com.qf.param.VO.ProductCommentPageListVO;
import com.qf.redis.RedisUtil;
import com.qf.service.ProductReviewLikeDislikeService;
import com.qf.service.ProductReviewService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @Author Ayases
 * @Date 2025/6/11 20:53
 * @Desc
 */
@Service
public class ProductReviewServiceImpl implements ProductReviewService {

    @Resource
    private ProductReviewMapper productReviewMapper;

    @Resource
    private RedisUtil redisUtil;

    /**
     * 获取商品评论信息
     * 逻辑：
     * 1. 创建分页对象，基于前端传入的分页参数
     * 2. 执行分页查询：只查询productId=productCommentPageDTO.getProductId的商品评论信息,status=1的评论信息
     * 3. 获取查询到的评论列表
     * 4. 构建Redis中当天点赞/点踩数的Key（使用hutool工具类，记得引入）
     * 5. 从Redis获取当天的增量数据，与数据库中点赞/点踩数进行合并计算
     * 6. 将ProductReview列表转换为ProductCommentPageListVO列表，处理一部分数据
     * 7. 构造分页返回对象
     *
     * @param productCommentPageDTO
     * @return
     */
    @Override
    public PageVO<ProductCommentPageListVO> getCommentInfo(ProductCommentPageDTO productCommentPageDTO) {
        // 1. 创建分页对象，基于前端传入的分页参数
        Page<ProductReview> page = new Page<>(productCommentPageDTO.getPageNum(), productCommentPageDTO.getPageSize());

        // 2. 执行分页查询：只查询productId=productCommentPageDTO.getProductId的商品评论信息,status=1的评论信息
        page = productReviewMapper.selectPage(page, Wrappers.lambdaQuery(ProductReview.class)
                .eq(ProductReview::getProductId, productCommentPageDTO.getProductId())
                .eq(ProductReview::getStatus, 1));

        // 3. 获取查询到的评论列表
        List<ProductReview> records = page.getRecords();

        // 4. 构建Redis中当天点赞/点踩数的Key（使用hutool工具类，记得引入）
        String today = DateUtil.format(new Date(), "yyyyMMdd");
        String likeKey = String.format("comment_like:%s", today);   // 评论点赞Key
        String dislikeKey = String.format("comment_dislike:%s", today); // 评论点踩Key

        // 5. 从Redis获取当天的增量数据
        Map<String, Object> likeCacheMap = redisUtil.getCacheMap(likeKey);
        Map<String, Object> dislikeCacheMap = redisUtil.getCacheMap(dislikeKey);

        // 6. 将ProductReview列表转换为ProductCommentPageListVO列表，处理一部分数据
        List<ProductCommentPageListVO> voList = records.stream().map(review -> {
            ProductCommentPageListVO vo = new ProductCommentPageListVO();

            // 设置基础属性,使用BeanUtils.copyProperties方法
            // 将ProductReview属性复制到ProductCommentPageListVO中
            BeanUtils.copyProperties(review, vo);

            // 处理图片，将图片字符串转换为List<String>
            if (StringUtils.isNotBlank(review.getImageUrls())) {
                vo.setImageUrls(Arrays.asList(review.getImageUrls().split(",")));
            }

            // 获取评论ID作为Redis中的键
            String reviewId = String.valueOf(review.getId());

            // 计算实时点赞数 = 数据库基础值 + Redis当天增量
            int baseLikeCount = review.getLikeCount() != null ? review.getLikeCount() : 0;
            int realtimeLikeCount = baseLikeCount + Optional.ofNullable(likeCacheMap.get(reviewId))
                    .map(val -> Integer.parseInt(val.toString()))
                    .orElse(0);
            vo.setLikeCount(realtimeLikeCount);

            // 计算实时点踩数 = 数据库基础值 + Redis当天增量
            int baseDislikeCount = review.getDislikeCount() != null ? review.getDislikeCount() : 0;
            int realtimeDislikeCount = baseDislikeCount + Optional.ofNullable(dislikeCacheMap.get(reviewId))
                    .map(val -> Integer.parseInt(val.toString()))
                    .orElse(0);
            vo.setDislikeCount(realtimeDislikeCount);

            return vo;
        }).collect(Collectors.toList());

        // 7. 构造分页返回对象
        PageVO<ProductCommentPageListVO> pageVO = new PageVO<>();
        pageVO.setTotal(page.getTotal());       // 总记录数
        pageVO.setDataList(voList);             // 当前页数据列表

        return pageVO;

    }




}
